/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package EindOefJDBC;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 *
 * @author Joris.Lefever
 */
public class NewMain {

    /**
     * @param args the command line arguments
     */
    static Connection databaseConnection = null;
    static Statement statementGenres = null;
    static Statement statementVoorstellingen = null;
    static Statement statementVoorstelling = null;
    static Statement statementKlanten = null;
    static PreparedStatement statementReservaties = null;
    static Statement statementUpdate = null;
    static ResultSet resultsetGenres = null;
    static ResultSet resultsetVoorstellingen = null;
    static ResultSet resultsetVoorstelling = null;
    static ResultSet resultsetKlanten = null;
    static ResultSet resultsetReservaties = null;
    static ResultSet resultsetUpdate = null;
    static Scanner sc = new Scanner(System.in);
    static int availableSeats = 0;
    static int wantedSeats = 0;
    static int genreNr = 0;
    static int voorstellingNr = 0;
    static String paswoordString, klantString;
    static List<Reservaties> reservaties = new ArrayList<>();
    //static int[][] reservaties = new int[1000][4];
    static int index = 0;
    static boolean dummy1 = true, dummy2 = true, dummy3 = true, dummy4 = true;

    public static void openDatabaseConnection() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            String sourceURL = "jdbc:mysql://localhost:3306/cultuurhuis";
            databaseConnection = DriverManager.getConnection(sourceURL, "root", "SQLR00t");
        } catch (ClassNotFoundException | SQLException ex) {
            System.err.println(ex);
        }
    }

    public static void readGenres() {
        try {
            statementGenres = databaseConnection.createStatement();
            resultsetGenres = statementGenres.executeQuery("SELECT * FROM genres");
            while (resultsetGenres.next()) {
                System.out.println(resultsetGenres.getInt("genrenr") + " " + resultsetGenres.getString("genre"));
            }

            System.out.println("\nGeef genre nummer? (Om programma te beeindigen, type 'stoppen') \n");
            String inputString = sc.next();
            String stopString = "stoppen";
            if (stopString.equalsIgnoreCase(inputString)) {
                System.out.println("Programma wordt beeindigd!\n");
                dummy1 = false;
                dummy2 = false;
            } else if (checkGenre(inputString)) {
                System.out.println("Is een correct genre\n");
            } else {
                System.out.println("Is een incorrect genre\n!");
                dummy2 = false;
            }
        } catch (SQLException sqle) {
            System.err.println(sqle);
        }
    }

    public static void showVoorstellingen() {
        try {
            statementVoorstellingen = databaseConnection.createStatement();
            resultsetVoorstellingen = statementVoorstellingen.executeQuery("SELECT * FROM voorstellingen WHERE genrenr = " + genreNr);
            while (resultsetVoorstellingen.next()) {
                System.out.println(resultsetVoorstellingen.getInt("VoorstellingsNr") + " " + resultsetVoorstellingen.getString("titel"));
            }

            System.out.println("Geef voorstelling nummer? (Om terug te keren, type 'niets') \n");
            Scanner sc = new Scanner(System.in);
            String inputString = sc.next();
            String stopString = "niets";
            if (stopString.equalsIgnoreCase(inputString)) {
                System.out.println("Terug naar genre keuze!\n");
                dummy2 = false;
                dummy3 = false;
            } else if (checkVoorstelling(inputString)) {
                System.out.println("Is een correcte voorstelling!\n");
            } else {
                System.out.println("Is een incorrecte voorstellinge!\n");
                dummy3 = false;
            }
        } catch (SQLException sqle) {
            System.err.println(sqle);
        }
    }

    public static boolean checkGenre(String string) {
        boolean genre = false;
        try {
            resultsetGenres.beforeFirst();
            while (resultsetGenres.next()) {
                if (Integer.parseInt(string) == resultsetGenres.getInt("genrenr")) {
                    genre = true;
                    genreNr = resultsetGenres.getInt("genrenr");
                    break;
                } else {
                    genre = false;
                }

            }

        } catch (SQLException sqle) {
            System.err.println(sqle);
        }

        return genre;
    }

    public static boolean checkVoorstelling(String string) {
        boolean voorstelling = false;
        try {
            resultsetVoorstellingen.beforeFirst();
            while (resultsetVoorstellingen.next()) {
                if (Integer.parseInt(string) == resultsetVoorstellingen.getInt("voorstellingsnr")) {
                    voorstelling = true;
                    voorstellingNr = resultsetVoorstellingen.getInt("voorstellingsnr");
                    availableSeats = resultsetVoorstellingen.getInt("VrijePlaatsen");
                    break;
                } else {
                    voorstelling = false;
                }

            }

        } catch (SQLException sqle) {
            System.err.println(sqle);
        }


        return voorstelling;
    }

    public static void wantedSeats() {
        System.out.println("Hoeveel plaatsen wilt u reserveren (max " + availableSeats + ")? (Om te stoppen, type 'niets')\n");
        String inputString = sc.next();
        String stopString = "niets";
        if (stopString.equalsIgnoreCase(inputString)) {
            dummy2 = false;
            dummy3 = false;
            dummy4 = false;
        } else {
            wantedSeats = Integer.parseInt(inputString);
            if (wantedSeats > availableSeats) {
                System.out.println("U hebt het aantal zetels overschreden");
                dummy3 = false;
                dummy4 = false;
            }
        }
    }

    public static void checkKlantNummerPaswoord() {
        boolean dummy = true;
        try {
            statementKlanten = databaseConnection.createStatement();
            resultsetKlanten = statementKlanten.executeQuery("SELECT * FROM klanten");
            while (dummy) {
                System.out.println("Geef klantennummer of type 'stop' om uit dit menu te stappen.\n");
                klantString = sc.next();
                if (klantString.equalsIgnoreCase("stop")) {
                    System.out.println("Programma wordt beeindigd!\n");
                    dummy2 = false;
                    dummy3 = false;
                    dummy4 = false;
                    dummy = false;
                } else {
                    System.out.println("Geef paswoord?\n");
                    paswoordString = sc.next();
                    try {
                        resultsetKlanten.beforeFirst();
                        while (resultsetKlanten.next()) {
                            if (Integer.parseInt(klantString) == resultsetKlanten.getInt("klantnr")) {
                                if (paswoordString.equals(resultsetKlanten.getString("paswoord"))) {
                                    dummy = false;
                                    Reservaties r1 = new Reservaties(index + 2, Integer.parseInt(klantString), voorstellingNr, wantedSeats);
                                    reservaties.add(r1);
                                    index++;
                                    dummy2 = false;
                                    dummy3 = false;
                                    dummy4 = false;
                                    break;
                                }
                            } else {
                                System.out.println("Combinatie klantennummer en passwoord zijn fout!\n");
                            }
                        }
                    } catch (SQLException sqle) {
                        System.err.println(sqle);
                    }
                }
            }
        } catch (SQLException sqle) {
            System.err.println(sqle);
        }
    }

    public static void updateResLijst() {
        try {
            int index2 = 2;
            for (Reservaties res : reservaties) {
                boolean klantNr = false;
                resultsetKlanten.beforeFirst();
                while (resultsetKlanten.next()) {
                    if (res.getKlantNr() == resultsetKlanten.getInt("klantnr")) {
                        klantNr = true;
                        break;
                    } else {
                        klantNr = false;
                    }
                }

                if (klantNr) {
                    int testSeats = updateSeatsLijst(res);

                    if (res.getPlaatsen() > testSeats || res.getPlaatsen() < 0) {
                        System.out.println("Reservatie " + res.getReservatieNr() + " van klant " + res.getKlantNr() + " kan niet worden uitgeoefend. Er zijn reeds teveel zetels gereserveerd");
                        index2++;
                    } else {
                        System.out.println("Reserveer " + res.getPlaatsen() + " plaatsen.");
                        updateDatabase(res, index2);
                        index2++;
                    }
                } else {
                    System.out.println("Deze klant zit niet meer in het systeem");
                }
               
            }


        } catch (SQLException sqle) {
            System.err.println(sqle);
        }
    }

    public static void diminishSeats() {
        try {
            statementUpdate = databaseConnection.createStatement();
            resultsetUpdate = statementUpdate.executeQuery("SELECT * FROM voorstellingen");
            resultsetUpdate.beforeFirst();
            while (resultsetUpdate.next()) {
                PreparedStatement prepStatement = databaseConnection.prepareStatement("update voorstellingen set vrijeplaatsen = vrijeplaatsen*0.5 where voorstellingsnr = ?");
                prepStatement.setString(1, resultsetUpdate.getString("voorstellingsnr"));
                int aantal = prepStatement.executeUpdate();

            }
        } catch (SQLException sqle) {
            System.err.println(sqle);
        }
    }

    public static void updateDatabase(Reservaties res,int index2) {
        try {
            databaseConnection.setAutoCommit(false);
            databaseConnection.setTransactionIsolation(java.sql.Connection.TRANSACTION_READ_COMMITTED);
            statementReservaties = databaseConnection.prepareStatement("update voorstellingen set vrijeplaatsen = vrijeplaatsen- ? where voorstellingsnr = ?");
            statementReservaties.setString(1, Integer.toString(res.getPlaatsen()));
            statementReservaties.setString(2, Integer.toString(res.getVoorstellingsNr()));
            statementReservaties.addBatch();

            Statement statement = databaseConnection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
            ResultSet resultset = statement.executeQuery("select * from reservaties");
            resultset.moveToInsertRow();
            //resultset.updateString(1, Integer.toString(index2));
            resultset.updateString(2, Integer.toString(res.getKlantNr()));
            resultset.updateString(3, Integer.toString(res.getVoorstellingsNr()));
            resultset.updateString(4, Integer.toString(res.getPlaatsen()));
            resultset.insertRow();
            resultset.moveToCurrentRow();
            
            int[] updateCounts = statementReservaties.executeBatch();
            databaseConnection.commit();
            databaseConnection.setAutoCommit(true);

        } catch (SQLException sqle) {
            System.err.println(sqle);
        }
    }
    
    public static int updateSeatsLijst(Reservaties res) {
        int testSeats = 0;
        try {
            Statement newStatement = databaseConnection.createStatement();
            ResultSet newResultset = newStatement.executeQuery("SELECT * FROM voorstellingen WHERE voorstellingsnr = " + res.getVoorstellingsNr());
 
             if (newResultset.next()){
                testSeats = newResultset.getInt("VrijePlaatsen");
                System.out.println("Er zijn nog " + testSeats + " vrije plaatsen");
                System.out.println("");
                newStatement.close();
             }
        } catch (SQLException sqle) {
            System.err.println(sqle);
        }
        return testSeats;
    }

    public static void main(String[] args) {
        openDatabaseConnection();

        while (dummy1) {
            dummy2 = true;
            dummy3 = true;
            dummy4 = true;
            readGenres();
            while (dummy2) {
                dummy3 = true;
                dummy4 = true;
                showVoorstellingen();
                while (dummy3) {
                    dummy4 = true;
                    wantedSeats();
                    while (dummy4) {
                        checkKlantNummerPaswoord();
                    }
                }
            }
        }

        diminishSeats();
        updateResLijst();
 


    }
}
